function defaultEquals(a, b) {
  return a === b
}

class Node {
  constructor(element) {
    // 要加入链表的元素
    this.element = element
    // 指向下一个链表的指针
    this.next = null
  }
}

class LinkedList {
  constructor(equalsFn = defaultEquals) {
    this.count = 0
    this.head = null
    this.equalsFn = equalsFn
  }

  /**
   * 向链表尾部添加一个新元素
   * @param element
   */
  push(element) {
    const node = new Node(element)
    let current
    if (this.head === null) {
      this.head = node
    } else {
      current = this.head
      while (current.next !== null) {
        current = current.next
      }
      // 将其 next 赋值新元素，建立链接
      current.next = node
    }
    this.count++
  }

  /**
   * 向链表的特定位置插入一个新元素
   * @param element
   * @param position
   */
  insert(element, position) {}

  /**
   * 返回链表中特定位置的元素，如果链表中不存在这样的元素，则返回 undefined
   * @param index
   */
  getElementAt(index) {}

  /**
   * 返回元素在链表中的索引。如果链表中没有该元素则返回 -1
   * @param element
   */
  indexOf(element) {}

  /**
   * 在链表的特定位置移除一个元素
   * @param position
   */
  removeAt(position) {}

  /**
   * 如果链表中不包含任何元素，返回true；否则返回 false
   */
  isEmpty() {}

  /**
   * 返回链表包含的元素个数
   */
  size() {}

  /**
   * 返回链表字符串
   */
  toString() {}
}
